package ctrlayer;
import modellayer.*;

import java.io.*;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;

public class OrdreCtr {
    private PersonCtr pCtr;
    private VareCtr vCtr;
    private OrdreCont oCon;
    private boolean erTilbud;
    private boolean erOrdre;

    public OrdreCtr() 
    {
        oCon = OrdreCont.getInstance();
        vCtr = new VareCtr();
        pCtr = new PersonCtr();
    }

    public boolean createOrdre(String tlf, boolean erTilbud, boolean erOrdre, String dato, String status, double totalPris)
    {
        boolean succes= false;
        this.erTilbud = erTilbud;
        this.erOrdre = erOrdre;
        Kunde k = pCtr.findKunde(tlf);
        if(!erTilbud && !erOrdre)
        {
            Ordre o = new Ordre(dato);
            oCon.addOrdre(o);
            k.addOrdre(o);
            succes = true;
        }
        //erTilbud overrider erOrdre, dvs hvis begge er true oprettes tilbud
        else if(erTilbud)
        {
            Ordre o = new Ordre(dato, status);
            oCon.addOrdre(o);
            k.addOrdre(o);
            succes = true;
        }
        else 
        {
            Ordre o = new Ordre(dato, status, totalPris);
            oCon.addOrdre(o);
            k.addOrdre(o);
            succes = true;
        }
        return succes;
    }

    public boolean removeOrdre(String tlf, int ordreNr)
    {
        boolean succes = false;
        Kunde k = pCtr.findKunde(tlf);
        Ordre o = findOrdre(ordreNr);
        if(k != null && o != null)
        {
            if(!o.getStatus().equals("Afsluttet"))
            {
                k.removeOrdre(o);
                succes = true;
            }
        }
        else
        {
            System.out.println("Ordren er afsluttet, der kan ikke laves ændringer");
        }

        return succes;
    }
    
    public Vare findVare(int vareID)
    {
    	return vCtr.findVare(vareID);
    }
    
    public ArrayList<Vare> getVareList()
    {
    	return vCtr.getVareList();
    }
    
    public boolean deleteOrdre(int ordreNr)
    {
    	return oCon.deleteOrdre(ordreNr);
    }

    public void ordreNoCounterCheck()
    {
        if(!oCon.getOrdrer().isEmpty())
        {
            for(int i = 0; i < oCon.getOrdrer().size(); i++)
            {
                Ordre o = oCon.getOrdrer().get(i);
                if(o.getOrdreNr() > o.getStaticCounter())
                {
                    o.ordreNoCounter();
                }
            }
        }
    }

    public Kunde findKundeOrdreNr(int ordreNr)
    {
        return pCtr.findKundeOrdreNr(ordreNr);
    }

    public boolean addVareTilOrdre(int ordreNr, int vareID, int antal)
    {
        boolean succes = false;
        Ordre o = findOrdre(ordreNr);
        if(o != null)
        {
            if(!o.getStatus().equals("Afsluttet"))
            {
                Vare v = vCtr.findVare(vareID);
                Vare vNy = vCtr.newVare(v.getNavn(), v.getBeskrivelse(), v.getPris(), v.getStregkode(), antal, 0, 100);
                o.addVareToList(vNy);
                if(o.getVList().contains(vNy))
                {
                    succes = true;
                }
                o.setTotalPris(o.getTotalPris() + (v.getPris()*antal));
            }
            else
            {
                System.out.println("Ordren er afsluttet, der kan ikke laves ændringer");
            }
        }
        return succes;
    }

    public Vare findVarePåListStregkode(int ordreNr, int stregkode)
    {
        Ordre o = findOrdre(ordreNr);
        return o.getVareFromListStregkode(stregkode);
    }

    public Vare findVarePåListe(int ordreNr, int vareID)
    {
        Ordre o = findOrdre(ordreNr);
        return o.getVareFromList(vareID);
    }

    public void afslutOrdre(int ordreNr)
    {
        Ordre o = findOrdre(ordreNr);
        o.setStatus("Afsluttet");
        beregneRabat(o);
    }

    public double beregneRabat(Ordre o)
    {
        double beregnrabat = o.getTotalPris();
        Kunde k = findKundeOrdreNr(o.getOrdreNr());
        if(k instanceof FastKunde)
        {
            beregnrabat = beregnrabat * (1-((((FastKunde)k).getKundegrp())/100));
        }
        return beregnrabat;
    }

    public boolean setAntal(int ordreNr, int vareID, int antal)
    {
        boolean succes = false;
        Vare v = findVarePåListe(ordreNr, vareID);
        Ordre o = findOrdre(ordreNr);
        if(!o.getStatus().equals("Afsluttet"))
        {
            if(v != null)
            {
                v.setBeholdning(antal);
                succes = true;
            }
        }
        else
        {
            System.out.println("Ordren er afsluttet, der kan ikke laves ændringer");
        }

        return succes;
    }

    public boolean deleteVareFraListe(int ordreNr, int vareID)
    {
        Ordre o = findOrdre(ordreNr);
        if(o != null)
        {
            if(!o.getStatus().equals("Afsluttet"))
            {
                Vare v = o.getVareFromList(vareID);
                o.setTotalPris(o.getTotalPris() - (v.getBeholdning() * v.getPris()));
                return o.deleteVareFromList(vareID);
            }
            else
            {
                System.out.println("Ordren er afsluttet, der kan ikke laves ændringer");
            }
        }
        return false;
    }

    public Ordre findOrdre(int OrdreNr)
    {
        return oCon.getOrdre(OrdreNr);
    }

    public boolean isErTilbud() 
    {
        return erTilbud;
    }

    public void setErTilbud(boolean erTilbud) 
    {
        this.erTilbud = erTilbud;
    }

    public boolean isErOrdre() 
    {
        return erOrdre;
    }

    public void setErOrdre(boolean erOrdre) 
    {
        this.erOrdre = erOrdre;
    }

    public void save() throws IOException
    {
        oCon.saveToFile();
    }

    public void load() throws IOException, ClassNotFoundException
    {
        oCon.loadFromFile();
    }

}
